package com.scheduling.schedule.algorithm;

import com.scheduling.order.entity.Order;
import com.scheduling.schedule.dto.ScheduleResult;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 排产算法接口（重新设计版）
 * 完整的排产流程：订单 → 工单生成 → 任务排产
 *
 * @author 开发团队
 */
public interface ScheduleAlgorithm {

    /**
     * 执行完整排产算法
     * <p>
     * 第一阶段：根据订单和算法策略生成工单
     * 第二阶段：根据工单和机器负荷生成生产任务
     *
     * @param orders            待排产的订单列表（算法真正的输入）
     * @param scheduleStartTime 排产开始时间
     * @return 完整的排产结果（包含生成的工单和任务）
     */
    ScheduleResult schedule(List<Order> orders, LocalDateTime scheduleStartTime);

    /**
     * 获取算法类型
     *
     * @return 算法类型代码
     */
    String getAlgorithmType();

    /**
     * 获取算法描述
     *
     * @return 算法描述
     */
    String getDescription();

    /**
     * 算法第一阶段：根据订单生成工单
     * 不同算法有不同的工单生成策略：
     * - 紧急优先：可能按优先级拆分/重组订单
     * - 批量生产：可能合并相同产品的订单
     * - FIFO：按订单顺序直接转换为工单
     *
     * @param orders            订单列表
     * @param scheduleStartTime 排产开始时间
     * @return 根据算法策略生成的工单列表
     */
    List<com.scheduling.schedule.entity.WorkOrder> generateWorkOrders(List<Order> orders,
                                                                      LocalDateTime scheduleStartTime);

    /**
     * 算法第二阶段：根据工单和机器负荷生成生产任务
     *
     * @param workOrders        第一阶段生成的工单
     * @param scheduleStartTime 排产开始时间
     * @return 生产任务列表
     */
    List<com.scheduling.schedule.entity.ProductionTask> generateProductionTasks(
            List<com.scheduling.schedule.entity.WorkOrder> workOrders, LocalDateTime scheduleStartTime);
} 